SwiftUI 開発者向けの Flutter
Flutter を使用してモバイル アプリを作成したい SwiftUI 開発者 このガイドを確認する必要があります。 既存の SwiftUI の知識を Flutter に適用する方法について説明します。
Flutter はクロスプラットフォーム アプリケーションを構築するためのフレームワークです Dart プログラミング言語を使用します。 Dart を使用したプログラミングのいくつかの違いを理解するには Swift を使用したプログラミングについては、を参照してください。Swift 開発者として Dart を学ぶとSwift 開発者向けの Flutter 同時実行性。
SwiftUI の知識と経験 Flutter を使用して構築する場合、これらは非常に価値があります。
Flutter は多くの調整も行います iOS および macOS で実行するときのアプリの動作に影響します。 その方法については、を参照してください。プラットフォームの適応。
このドキュメントは、飛び回ってクックブックとして使用できます。 自分のニーズに最も関連する質問を見つけます。 このガイドにはサンプルコードが埋め込まれています。 DartPad で完全な動作例をテストしたり、GitHub で表示したりできます。
概要
Flutter と SwiftUI のコードは、UI の外観と動作を説明します。 開発者はこのタイプのコードを「宣言型フレームワーク。
ビューとウィジェット
SwiftUIUIコンポーネントを次のように表しますビュー。 ビューを設定するには、次を使用します。修飾子。
Text("Hello, World!") // <-- This is a View
.padding(10) // <-- This is a modifier of that View
flutterUIコンポーネントを次のように表しますウィジェット。
ビューとウィジェットはどちらも、変更が必要になるまでのみ存在します。 これらの言語ではこのプロパティを呼び出します不変性。 SwiftUI は、UI コンポーネントのプロパティを View 修飾子として表します。 対照的に、Flutter は UI コンポーネントと 彼らの特性。
Padding( // <-- This is a Widget
padding: EdgeInsets.all(10.0), // <-- So is this
child: Text("Hello, World!"), // <-- This, too
)));
レイアウトを構成するには、SwiftUI と Flutter の両方が UI コンポーネントをネストします お互いの中で。 SwiftUI はビューをネストし、Flutter はウィジェットをネストします。
レイアウトプロセス
SwiftUI次のプロセスを使用してビューをレイアウトします。
- 親ビューは、子ビューにサイズを提案します。
- 後続のすべての子ビュー:
- ~にサイズを提案する彼らの子どもの視点
- その子にどのサイズが欲しいかを尋ねます
- 各親ビューは、返されたサイズで子ビューをレンダリングします。
flutterそのプロセスは多少異なります。
- 親ウィジェットは制約をその子に渡します。 制約には、高さと幅の最小値と最大値が含まれます。
- 子供は自分の大きさを決めようとします。独自の子のリストを使用して同じプロセスを繰り返します。
- 子の制約を子に通知します。
- それは子供にどのくらいのサイズになりたいかを尋ねます。
- 親が子を配置します。
- 要求されたサイズが制約内に収まる場合、 親はそのサイズを使用します。
- 要求されたサイズが制約に適合しない場合は、 親が高さ、幅、またはその両方を制限します。 その制約。
Flutter は、親コンポーネントがオーバーライドできるため、SwiftUI とは異なります。 子供の希望サイズ。ウィジェットは希望するサイズにすることはできません。 また、親としての画面上の位置を認識したり決定したりすることもできません。 その決定を下します。
子ウィジェットを強制的に特定のサイズでレンダリングするには、 親は厳しい制約を設定する必要があります。 制約の最小サイズ値を超えると制約が厳しくなります 最大サイズ値と等しくなります。
のSwiftUI、ビューは利用可能なスペースまで拡張される可能性があります。 サイズをそのコンテンツのサイズに制限します。 flutterウィジェットも同様に動作します。
ただし、Flutter では、親ウィジェットは無制限の制約を提供できます。 無制限の制約では、最大値が無限大に設定されます。
UnboundedBox(
child: Container(
width: double.infinity, height: double.infinity, color: red),
)
子が展開され、無制限の制約がある場合、 Flutter はオーバーフロー警告を返します。
UnconstrainedBox(
child: Container(color: red, width: 4000, height: 50),
)
Flutter で制約がどのように機能するかを学ぶには、 見る制約を理解する。
デザインシステム
Flutter は複数のプラットフォームをターゲットとしているため、アプリには あらゆる設計システムに準拠します。 このガイドの特徴ですが、材料ウィジェット、 Flutter アプリではさまざまなデザイン システムを使用できます。
- カスタムマテリアルウィジェット
- コミュニティが構築したウィジェット
- 独自のカスタムウィジェット
- クパチーノのウィジェットApple のヒューマン インターフェイス ガイドラインに準拠したもの
を備えた優れたリファレンス アプリをお探しの場合は、 カスタム デザイン システム、チェックアウト素晴らしい。
UIの基本
このセクションでは、UI 開発の基本について説明します。 Flutter と SwiftUI との比較。 これには、アプリの開発を開始する方法、静的テキストを表示する方法、 ボタンの作成、オンプレス イベントへの反応、リスト、グリッドなどの表示。
入門
のSwiftUI、 あなたが使うApp
アプリを起動します。
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
HomePage()
}
}
}
もう 1 つの一般的な SwiftUI プラクティスでは、アプリ本体をstruct
に準拠するものView
次のようなプロトコル:
struct HomePage: View {
var body: some View {
Text("Hello, World!")
}
}
を始めるには flutterapp、アプリのインスタンスをに渡します
のrunApp
関数。
void main() {
runApp(const MyApp());
}
App
ウィジェットです。 build メソッドは、
それが表すユーザーインターフェイス。
アプリを次で始めるのが一般的ですWidgetApp
クラス、
好きCupertinoApp
。
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
// Returns a CupertinoApp that, by default,
// has the look and feel of an iOS app.
return const CupertinoApp(
home: HomePage(),
);
}
}
で使用されるウィジェットHomePage
から始まるかもしれませんScaffold
クラス。Scaffold
アプリの基本的なレイアウト構造を実装します。
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: Text(
'Hello, World!',
),
),
);
}
}
Flutter がどのように使用するかに注目してください。Center
ウィジェット。
SwiftUI は、デフォルトでビューのコンテンツを中央にレンダリングします。
Flutter では必ずしもそうとは限りません。Scaffold
レンダリングされませんbody
画面中央のウィジェット。
テキストを中央に配置するには、テキストをCenter
ウィジェット。
さまざまなウィジェットとそのデフォルトの動作について詳しくは、以下をご覧ください。
のウィジェットカタログ。
ボタンの追加
のSwiftUIを使用します。Button
ボタンを作成するための構造体。
Button("Do something") {
// this closure gets called when your
// button is tapped
}
同じ結果を達成するには flutter、
使用CupertinoButton
クラス:
CupertinoButton(
onPressed: () {
// This closure is called when your button is tapped.
},
child: const Text('Do something'),
)
flutter事前定義されたスタイルを持つさまざまなボタンにアクセスできます。
のCupertinoButton
クラスはクパチーノ図書館からのものです。
クパチーノ ライブラリのウィジェットは Apple のデザイン システムを使用しています。
コンポーネントを水平方向に整列させる
のSwiftUI, スタック ビューは、レイアウトの設計において大きな役割を果たします。 2 つの別個の構造により、スタックを作成できます。
-
HStack
水平スタックビューの場合 -
VStack
垂直スタックビューの場合
次の SwiftUI ビューは地球儀の画像を追加し、 テキストを水平スタックビューに変換します。
HStack {
Image(systemName: "globe")
Text("Hello, world!")
}
flutter用途Row
それよりもHStack
:
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(CupertinoIcons.globe),
Text('Hello, world!'),
],
),
のRow
ウィジェットにはList<Widget>
の中にchildren
パラメータ。
のmainAxisAlignment
プロパティは Flutter に子の配置方法を指示します
余分なスペースあり。MainAxisAlignment.center
子どもたちを
主軸の中心。ためにRow
、主軸は水平です
軸。
コンポーネントを垂直方向に整列させる
次の例は、前のセクションの例に基づいています。
のSwiftUI、 あなたが使うVStack
コンポーネントを配置して
垂直の柱。
VStack {
Image(systemName: "globe")
Text("Hello, world!")
}
flutter前の例と同じ Dart コードを使用します。
交換することを除いてColumn
ためにRow
:
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(CupertinoIcons.globe),
Text('Hello, world!'),
],
),
リストビューの表示
のSwiftUIを使用します。List
シーケンスを表示するための基本コンポーネント
アイテムの。
一連のモデル オブジェクトを表示するには、ユーザーが次の操作を実行できることを確認してください。
モデルオブジェクトを特定します。
オブジェクトを識別できるようにするには、0a9c74dc-5d94-4ec0-9c82-e1247b7b675eプロトコル。
struct Person: Identifiable {
var name: String
}
var persons = [
Person(name: "Person 1"),
Person(name: "Person 2"),
Person(name: "Person 3"),
]
struct ListWithPersons: View {
let persons: [Person]
var body: some View {
List {
ForEach(persons) { person in
Text(person.name)
}
}
}
}
これはどのように似ていますか flutterリスト ウィジェットを構築することを好みます。 Flutter では、リスト項目を識別できる必要はありません。 表示するアイテムの数を設定し、各アイテムのウィジェットを構築します。
class Person {
String name;
Person(this.name);
}
var items = [
Person('Person 1'),
Person('Person 2'),
Person('Person 3'),
];
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].name),
);
},
),
);
}
}
Flutter にはリストに関するいくつかの注意事項があります。
-
の
ListView
ウィジェットにはビルダーメソッドがあります。 これは次のように機能しますForEach
SwiftUI内でList
構造体。 -
の
itemCount
のパラメータListView
アイテムの数を設定します のListView
と表示されます。 -
の
itemBuilder
ゼロの間のインデックスパラメータがあります itemCount より 1 つ少ない値。
前の例では、ListTile
各アイテムのウィジェット。
のListTile
ウィジェットには次のようなプロパティが含まれますheight
とfont-size
。
これらのプロパティはリストの作成に役立ちます。ただし、Flutter では戻ることができます。
データを表すほぼすべてのウィジェット。
グリッドを表示する
無条件グリッドを構築する場合SwiftUI、
あなたが使うGrid
とGridRow
。
Grid {
GridRow {
Text("Row 1")
Image(systemName: "square.and.arrow.down")
Image(systemName: "square.and.arrow.up")
}
GridRow {
Text("Row 2")
Image(systemName: "square.and.arrow.down")
Image(systemName: "square.and.arrow.up")
}
}
グリッドを表示するには flutter、 使用GridView
ウィジェット。
このウィジェットにはさまざまなコンストラクターがあります。各コンストラクターには、
同様の目標ですが、異なる入力パラメータを使用します。
次の例では、.builder()
イニシャライザ:
const widgets = [
Text('Row 1'),
Icon(CupertinoIcons.arrow_down_square),
Icon(CupertinoIcons.arrow_up_square),
Text('Row 2'),
Icon(CupertinoIcons.arrow_down_square),
Icon(CupertinoIcons.arrow_up_square),
];
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisExtent: 40,
),
itemCount: widgets.length,
itemBuilder: (context, index) => widgets[index],
),
);
}
}
のSliverGridDelegateWithFixedCrossAxisCount
代表者が決定する
グリッドがコンポーネントをレイアウトするために使用するさまざまなパラメーター。
これもcrossAxisCount
それがアイテムの数を決定します
各行に表示されます。
SwiftUIの仕組みGrid
そして flutterさんGridView
その点で違いますGrid
必要GridRow
。GridView
デリゲートを使用して、
グリッドはそのコンポーネントをレイアウトする必要があります。
スクロールビューの作成
のSwiftUI、 あなたが使うScrollView
カスタムスクロールを作成するには
コンポーネント。
次の例では、一連のPersonView
インスタンス
スクロール可能な方法で。
ScrollView {
VStack(alignment: .leading) {
ForEach(persons) { person in
PersonView(person: person)
}
}
}
スクロールビューを作成するには、 flutter用途SingleChildScrollView
。
次の例では、関数mockPerson
インスタンスをモックする
のPerson
カスタムを作成するクラスPersonView
ウィジェット。
SingleChildScrollView(
child: Column(
children: mockPersons
.map(
(person) => PersonView(
person: person,
),
)
.toList(),
),
),
レスポンシブでアダプティブなデザイン
のSwiftUI、 あなたが使うGeometryReader
相対的なビュー サイズを作成します。
たとえば、次のようなことができます。
- かける
geometry.size.width
何らかの要因によって、幅。 - 使用
GeometryReader
アプリのデザインを変更するためのブレークポイントとして使用します。
サイズクラスが次のとおりであるかどうかも確認できます。.regular
また.compact
使用してhorizontalSizeClass
。
相対ビューを作成するには flutter、次の 2 つのオプションのいずれかを使用できます。
- を入手
BoxConstraints
内のオブジェクトLayoutBuilder
クラス。 - 使用
MediaQuery.of()
ビルド関数内で 現在のアプリのサイズと向きを取得します。
さらに詳しく知りたい場合は、こちらをご覧くださいレスポンシブで適応性のあるアプリの作成。
状態の管理
のSwiftUIを使用します。@State
を表すプロパティ ラッパー
SwiftUI ビューの内部状態。
struct ContentView: View {
@State private var counter = 0;
var body: some View {
VStack{
Button("+") { counter+=1 }
Text(String(counter))
}
}}
SwiftUIより複雑な状態のためのいくつかのオプションも含まれています
などの管理ObservableObject
プロトコル。
flutterを使用してローカル状態を管理しますStatefulWidget
。
次の 2 つのクラスを使用してステートフル ウィジェットを実装します。
- のサブクラス
StatefulWidget
- のサブクラス
State
のState
オブジェクトはウィジェットの状態を保存します。
ウィジェットの状態を変更するには、次のように呼び出します。setState()
からState
サブクラス
フレームワークにウィジェットを再描画するように指示します。
次の例は、カウンター アプリの一部を示しています。
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('$_counter'),
TextButton(
onPressed: () => setState(() {
_counter++;
}),
child: const Text('+'),
),
],
),
),
);
}
}
状態を管理するその他の方法については、以下を参照してください。状態管理。
アニメーション
UI アニメーションには主に 2 つのタイプがあります。
- 現在の値から新しいターゲットまでアニメーション化することを暗黙的に示します。
- 尋ねられたときにアニメーション化する明示的。
暗黙的なアニメーション
SwiftUI と Flutter はアニメーションに対して同様のアプローチを採用しています。
どちらのフレームワークでも、次のようなパラメータを指定します。duration
、 とcurve
。
のSwiftUIを使用します。animate()
暗黙的に処理する修飾子
アニメーション。
Button(“Tap me!”){
angle += 45
}
.rotationEffect(.degrees(angle))
.animation(.easeIn(duration: 1))
flutter暗黙的なアニメーション用のウィジェットが含まれています。
これにより、一般的なウィジェットのアニメーション化が簡素化されます。
Flutter は、これらのウィジェットに次の形式で名前を付けます。AnimatedFoo
。
例: ボタンを回転するには、AnimatedRotation
クラス。
これによりアニメーション化されます。Transform.rotate
ウィジェット。
AnimatedRotation(
duration: const Duration(seconds: 1),
turns: turns,
curve: Curves.easeIn,
child: TextButton(
onPressed: () {
setState(() {
turns += .125;
});
},
child: const Text('Tap me!')),
),
Flutter を使用すると、カスタムの暗黙的アニメーションを作成できます。
新しいアニメーション ウィジェットを作成するには、TweenAnimationBuilder
。
明示的なアニメーション
露骨なアニメーションの場合、SwiftUIを使用しますwithAnimation()
関数。
flutter名前がフォーマットされた明示的にアニメーション化されたウィジェットが含まれます
好きFooTransition
。
一例としては、RotationTransition
クラス。
Flutter を使用すると、カスタムの明示的なアニメーションを作成することもできます。AnimatedWidget
またAnimatedBuilder
。
Flutter のアニメーションの詳細については、を参照してください。アニメーションの概要。
画面上に描画する
のSwiftUI、 あなたが使うCoreGraphics
線や形を描くには
画面。
flutterに基づく API があります。Canvas
クラス、
描画に役立つ 2 つのクラスがあります。
-
CustomPaint
それにはペインターが必要です:CustomPaint( painter: SignaturePainter(_points), size: Size.infinite, ),
-
ベッド4212f-e711-4703-a21d-e0d1e4902677キャンバスに描画するアルゴリズムを実装します。
class SignaturePainter extends CustomPainter { SignaturePainter(this.points); final List<Offset?> points; @override void paint(Canvas canvas, Size size) { final Paint paint = Paint() ..color = Colors.black ..strokeCap = StrokeCap.round ..strokeWidth = 5; for (int i = 0; i < points.length - 1; i++) { if (points[i] != null && points[i + 1] != null) { canvas.drawLine(points[i]!, points[i + 1]!, paint); } } } @override bool shouldRepaint(SignaturePainter oldDelegate) => oldDelegate.points != points; }
ナビゲーション
このセクションでは、アプリのページ間を移動する方法について説明します。 プッシュ&ポップ機構など。
ページ間の移動
開発者は、と呼ばれるさまざまなページを使用して iOS および macOS アプリを構築します。ナビゲーションルート。
のSwiftUI、NavigationStack
このページのスタックを表します。
次の例では、人物のリストを表示するアプリを作成します。 新しいナビゲーション リンクに個人の詳細を表示するには、 その人をタップします。
NavigationStack(path: $path) {
List {
ForEach(persons) { person in
NavigationLink(
person.name,
value: person
)
}
}
.navigationDestination(for: Person.self) { person in
PersonView(person: person)
}
}
小さいものがある場合は、 flutter複雑なリンクを必要としないアプリ、
使用Navigator
名前付きルートを使用します。
ナビゲーションルートを定義したら、
名前を使用してナビゲーション ルートを呼び出します。
-
に渡されるクラス内の各ルートに名前を付けます。
runApp()
関数。 次の例では、App
:// Defines the route name as a constant // so that it's reusable. const detailsPageRouteName = '/details'; class App extends StatelessWidget { const App({ super.key, }); @override Widget build(BuildContext context) { return CupertinoApp( home: const HomePage(), // The [routes] property defines the available named routes // and the widgets to build when navigating to those routes. routes: { detailsPageRouteName: (context) => const DetailsPage(), }, ); } }
次のサンプルは、次を使用して人のリストを生成します。
mockPersons()
。人物をタップすると、その人物の詳細ページが表示されます にNavigator
使用してpushNamed()
。ListView.builder( itemCount: mockPersons.length, itemBuilder: (context, index) { final person = mockPersons.elementAt(index); final age = '${person.age} years old'; return ListTile( title: Text(person.name), subtitle: Text(age), trailing: const Icon( Icons.arrow_forward_ios, ), onTap: () { // When a [ListTile] that represents a person is // tapped, push the detailsPageRouteName route // to the Navigator and pass the person's instance // to the route. Navigator.of(context).pushNamed( detailsPageRouteName, arguments: person, ); }, ); }, ),
-
を定義します
DetailsPage
詳細を表示するウィジェット 各人。 Flutter では、引数を 新しいルートに移動するときのウィジェット。 次を使用して引数を抽出しますModalRoute.of()
:class DetailsPage extends StatelessWidget { const DetailsPage({super.key}); @override Widget build(BuildContext context) { // Read the person instance from the arguments. final Person person = ModalRoute.of( context, )?.settings.arguments as Person; // Extract the age. final age = '${person.age} years old'; return Scaffold( // Display name and age. body: Column(children: [Text(person.name), Text(age)]), ); } }
より高度なナビゲーションとルーティングの要件を作成するには、 次のようなルーティング パッケージを使用します。go_router。
さらに詳しく知りたい場合は、こちらをご覧くださいナビゲーションとルーティング。
手動でポップバックする
のSwiftUIを使用します。dismiss
ポップバック先の環境値
前の画面。
Button("Pop back") {
dismiss()
}
の flutter、 使用pop()
の機能Navigator
クラス:
TextButton(
onPressed: () {
// This code allows the
// view to pop back to its presenter.
Navigator.of(context).pop();
},
child: const Text('Pop back'),
),
別のアプリに移動する
のSwiftUIを使用します。openURL
を開くための環境変数
別のアプリケーションへの URL。
@Environment(\.openURL) private var openUrl
// View code goes here
Button("Open website") {
openUrl(
URL(
string: "https://google.com"
)!
)
}
の flutter、 使用url_launcher
プラグイン。
CupertinoButton(
onPressed: () async {
await launchUrl(
Uri.parse('https://google.com'),
);
},
child: const Text(
'Open website',
),
),
テーマ、スタイル、メディア
少しの労力で Flutter アプリのスタイルを設定できます。 スタイリングには、明るいテーマと暗いテーマの切り替えが含まれます。 テキストと UI コンポーネントのデザインを変更する もっと。このセクションでは、アプリのスタイルを設定する方法について説明します。
ダークモードの使用
のSwiftUI、あなたはpreferredColorScheme()
の関数View
ダークモードを使用するには。
の flutter、アプリレベルでライトモードとダークモードを制御できます。
明るさモードを制御するには、theme
財産
のApp
クラス:
CupertinoApp(
theme: CupertinoThemeData(
brightness: Brightness.dark,
),
home: HomePage(),
);
テキストのスタイル設定
のSwiftUIでは、修飾子関数を使用してテキストのスタイルを設定します。
たとえば、フォントを変更するには、Text
弦、
使用font()
修飾子:
Text("Hello, world!")
.font(.system(size: 30, weight: .heavy))
.foregroundColor(.yellow)
テキストのスタイルを設定するには flutter、を追加しますTextStyle
値としてのウィジェット
のstyle
のパラメータText
ウィジェット。
Text(
'Hello, world!',
style: TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
color: CupertinoColors.systemYellow,
),
),
ボタンのスタイリング
のSwiftUIでは、修飾関数を使用してボタンのスタイルを設定します。
Button("Do something") {
// do something when button is tapped
}
.font(.system(size: 30, weight: .bold))
.background(Color.yellow)
.foregroundColor(Color.blue)
}
ボタン ウィジェットのスタイルを設定するには flutter、その子のスタイルを設定し、 またはボタン自体のプロパティを変更します。
次の例では:
- の
color
の財産CupertinoButton
を設定しますcolor
。 - の
color
子供の財産Text
ウィジェットはボタンを設定します テキストの色。
child: CupertinoButton(
color: CupertinoColors.systemYellow,
onPressed: () {},
padding: const EdgeInsets.all(16),
child: const Text(
'Do something',
style: TextStyle(
color: CupertinoColors.systemBlue,
fontSize: 30,
fontWeight: FontWeight.bold,
),
),
),
カスタムフォントの使用
のSwiftUI、2 つの手順でアプリでカスタム フォントを使用できます。
まず、フォント ファイルを SwiftUI プロジェクトに追加します。ファイルを追加した後、
使用.font()
修飾子を使用して UI コンポーネントに適用します。
Text("Hello")
.font(
Font.custom(
"BungeeSpice-Regular",
size: 40
)
)
の flutter、ファイルでリソースを制御します
名前付きpubspec.yaml
。このファイルはプラットフォームに依存しません。
プロジェクトにカスタム フォントを追加するには、次の手順に従います。
- という名前のフォルダーを作成します
fonts
プロジェクトのルートディレクトリにあります。 このオプションの手順は、フォントを整理するのに役立ちます。 - を追加してください
.ttf
、.otf
、 また.ttc
フォントファイルをfonts
フォルダ。 - を開きます
pubspec.yaml
プロジェクト内のファイル。 - を見つける
flutter
セクション。 -
カスタム フォントを
fonts
セクション。flutter: fonts: - family: BungeeSpice fonts: - asset: fonts/BungeeSpice-Regular.ttf
プロジェクトにフォントを追加すると、次のように使用できます。 次の例:
Text(
'Cupertino',
style: TextStyle(
fontSize: 40,
fontFamily: 'BungeeSpice',
),
)
アプリ内に画像をバンドルする
のSwiftUI、最初に画像ファイルを追加しますAssets.xcassets
、
次に、を使用しますImage
ビューを使用して画像を表示します。
画像を追加するには flutter、追加した方法と同様の方法に従います。 カスタムフォント。
- を追加
images
フォルダをルートディレクトリにコピーします。 -
このアセットを
pubspec.yaml
ファイル。flutter: assets: - images/Blueberries.jpg
画像を追加したら、Image
ウィジェットの.asset()
コンストラクタ。このコンストラクター:
- 指定されたパスを使用して、指定されたイメージをインスタンス化します。
- アプリにバンドルされているアセットから画像を読み取ります。
- 画像を画面に表示します。
完全な例を確認するには、以下を確認してください。Image
ドキュメント。
アプリにビデオをバンドルする
のSwiftUI、ローカルビデオファイルをアプリに2つにバンドルします
ステップ。
まず、インポートしますAVKit
フレームワークを作成してから、VideoPlayer
意見。
の flutterを追加します。ビデオプレーヤープラグインをプロジェクトに追加します。 このプラグインを使用すると、上で動作するビデオプレーヤーを作成できます。 Android、iOS、Web 上で同じコードベースから動作します。
- プラグインをアプリに追加し、ビデオ ファイルをプロジェクトに追加します。
- アセットを
pubspec.yaml
ファイル。 - 使用
VideoPlayerController
ビデオをロードして再生するクラス ファイル。
完全なチュートリアルを確認するには、video_player の例。